package com.example.designpatterns.iterator.advanced;

import com.example.designpatterns.iterator.Aggregate;
import com.example.designpatterns.iterator.Iterator;

/**
 * 二叉树集合 - 使用二叉树存储数据的集合
 * 展示如何为非线性结构实现迭代器模式
 */
public class TreeCollection<T extends Comparable<T>> implements Aggregate<T> {
    private TreeNode<T> root;
    
    /**
     * 添加元素到二叉树
     * @param value 要添加的元素
     */
    public void add(T value) {
        if (root == null) {
            root = new TreeNode<>(value);
        } else {
            addNode(root, value);
        }
    }
    
    private void addNode(TreeNode<T> node, T value) {
        int compareResult = value.compareTo(node.value);
        
        if (compareResult < 0) {
            // 小于当前节点值，放左边
            if (node.left == null) {
                node.left = new TreeNode<>(value);
            } else {
                addNode(node.left, value);
            }
        } else {
            // 大于等于当前节点值，放右边
            if (node.right == null) {
                node.right = new TreeNode<>(value);
            } else {
                addNode(node.right, value);
            }
        }
    }
    
    /**
     * 二叉树节点类
     * @param <E> 节点值类型
     */
    static class TreeNode<E> {
        E value;
        TreeNode<E> left;
        TreeNode<E> right;
        
        TreeNode(E value) {
            this.value = value;
        }
    }
    
    @Override
    public Iterator<T> createIterator() {
        return new InOrderIterator<>(this);
    }
    
    /**
     * 创建前序遍历迭代器
     * @return 前序遍历迭代器
     */
    public Iterator<T> createPreOrderIterator() {
        return new PreOrderIterator<>(this);
    }
    
    /**
     * 创建后序遍历迭代器
     * @return 后序遍历迭代器
     */
    public Iterator<T> createPostOrderIterator() {
        return new PostOrderIterator<>(this);
    }
    
    /**
     * 获取树的根节点
     * @return 根节点
     */
    public TreeNode<T> getRoot() {
        return root;
    }
} 